package com.hxzy.common.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.hutool.jwt.JWTException;
import com.hxzy.common.enums.AckCode;
import com.hxzy.common.resp.R;
import lombok.extern.log4j.Log4j2;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * springmvc全局异常处理
 */
@Log4j2
@RestControllerAdvice
public class SpringMvcGlobalException {


    /**
     * hibernate-validator验证数据异常的处理  @NotBlank  @Length
     * @param e
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    public R bindingException(BindException e){
        log.error(e);
        //得到所有的错误中的第一个
        String error=e.getAllErrors().get(0).getDefaultMessage();

        R<Object> build = R.build(AckCode.SYSTEM_PARAM_FAIL);
        build.setMsg(error);
        return build;
    }


    /**
     * 自定义异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = ServiceException.class)
    public R serviceException(ServiceException e){
        return R.build(e.getAckCode());
    }

    /**
     * 自定义异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = ServiceStringException.class)
    public R serviceStringException(ServiceStringException e){
        log.error(e.getMessage());
        return R.build(AckCode.FAIL,null,e.getMessage());
    }

    /**
     * jwt令牌异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = JWTException.class)
    public R jwtException(JWTException e){
        log.error(e);
        return R.build(AckCode.APPLE_ILLEGAL);
    }


    /**
     * sa-token令牌无效或没有令牌全局异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = NotLoginException.class)
    public R notLoginException(NotLoginException e){
        log.error(e);
        return R.build(AckCode.APPLE_ILLEGAL);
    }

}
